
import com.beust.jcommander.internal.Sets;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 不可变集合用法
 */
public class ImmutableTest {
    public void test(List<Integer> list) {
        list.remove(0);
    }

    @Test
    public void mutableTest() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        test(list);
        System.out.println(list);
    }

    /**
     * 使用JDK的Collections来创建不可变集合，比较繁琐，
     * 因为需要先创建一个可变集合，再通过方法将其变为不可变集合
     */
    @Test
    public void jdkImmutableTest() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        test(Collections.unmodifiableList(list));
        System.out.println(list);
    }

    /**
     * 使用Guava创建不可变集合
     */
    @Test
    public void guavaImmutableTest() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        // 下面三种都是创建了不可变Set集合
        // 1. 通过已存在的集合创建，与JDK来包装不可变集合类似
        ImmutableSet<Integer> immutableSet = ImmutableSet.copyOf(list);
        // 2. 通过初始值，直接创建不可变集合
        ImmutableSet<Integer> immutableSet1 = ImmutableSet.of(1, 2, 3);
        // 3. 通过builder构建器
        ImmutableSet<Object> immutableSet2 = ImmutableSet.builder()
                .add(1)
                .addAll(list)
                .add(4)
                .build();
        // 使用不可变集合与可变集合方式一样，除了不能调用会改变集合的方法。
        System.out.println(immutableSet2);
    }
}
